/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.impl;

import dao.CidadeDAO;
import dao.Conexao;
import dao.PortalDAOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.Cidade;

/**
 *
 * @author Tadeu Augusto
 */
public class CidadeDAOImpl implements CidadeDAO {

    private Connection conn;

    public CidadeDAOImpl() throws PortalDAOException {
        try {
            this.conn = Conexao.getConnection();
        } catch (Exception e) {
            throw new PortalDAOException("Erro: " + ":\n" + e.getMessage());
        }
    }

    @Override
    public void atualizar(Cidade cidade) throws PortalDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        if (cidade == null) {
            throw new PortalDAOException("Nenhuma cidade foi informado.");
        }
        try {
            String sql = "UPDATE cidade SET nome=?, estado=?"
                    + "WHERE codcidade=?";
            conn1 = this.conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, cidade.getNome());
            ps.setString(2, cidade.getEstado());
            ps.setString(3, cidade.getCodcidade());
        } catch (SQLException e) {
            throw new PortalDAOException("Erro ao atualizar cidade. \n" + e);
        } finally {
            Conexao.closeConnection(conn1, ps);
        }
    }

    @Override
    public void excluir(Cidade cidade) throws PortalDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        if (cidade == null) {
            throw new PortalDAOException("Nenhuma cidade informado.");
        }
        try {
            String sql = "DELETE FROM cidade WHERE codcidade = ?";
            conn1 = this.conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, cidade.getCodcidade());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new PortalDAOException("Erro ao excluir cidade " + e);
        } finally {
            Conexao.closeConnection(conn1, ps);
        }
    }

    @Override
    public void salvar(Cidade cidade) throws PortalDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        if (cidade == null) {
            throw new PortalDAOException("Nenhuma cidade foi informada.");
        }
        try {
            String sql = "INSERT INTO cidade values (?, ?, ?)";
            conn1 = this.conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, cidade.getCodcidade());
            ps.setString(2, cidade.getNome());
            ps.setString(3, cidade.getEstado());
            ps.executeUpdate();
        } catch (SQLException e) {
            throw new PortalDAOException("Erro ao inserir cidade " + e);
        } finally {
            Conexao.closeConnection(conn1, ps);
        }
    }

    @Override
    public List todasCidades() throws PortalDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        try {
            String sql = "SELECT * FROM cidade";
            conn1 = this.conn;
            ps = conn1.prepareStatement(sql);
            rs = ps.executeQuery();
            List<Cidade> listaCidades = new ArrayList<Cidade>();
            while (rs.next()) {
                String codcidade = rs.getString("codcidade");
                String nome = rs.getString("nome");
                String estado = rs.getString("estado");
                listaCidades.add(new Cidade(codcidade, nome, estado));
            }
            return listaCidades;
        } catch (SQLException e) {
            throw new PortalDAOException("Erro ao listar cidades. \n " + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }
    }

    @Override
    public Cidade procurarCidade(String nome, String estado) throws PortalDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        try {
            String sql = "SELECT * FROM cidade WHERE nome=? AND estado=?";
            conn1 = this.conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, nome);
            ps.setString(2, estado);
            rs = ps.executeQuery();
            Cidade cidade;
            if (!rs.next()) {
                cidade = new Cidade();
            } else {
                String codcidade = rs.getString("codcidade");
                String nome1 = rs.getString("nome");
                String estado1 = rs.getString("estado");
                cidade = new Cidade(codcidade, nome1, estado1);
            }
            return cidade;
        } catch (SQLException e) {
            throw new PortalDAOException("Erro ao procurar cidade " + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }
    }

    @Override
    public Cidade procurarCidade(String codcidade) throws PortalDAOException {
        PreparedStatement ps = null;
        Connection conn1 = null;
        ResultSet rs = null;
        try {
            String sql = "SELECT * FROM cidade WHERE codcidade=?";
            conn1 = this.conn;
            ps = conn1.prepareStatement(sql);
            ps.setString(1, codcidade);
            rs = ps.executeQuery();
            Cidade cidade;
            if (!rs.next()) {
                cidade = new Cidade();
            } else {
                String codcidade1 = rs.getString("codcidade");
                String nome = rs.getString("nome");
                String estado = rs.getString("estado");
                cidade = new Cidade(codcidade1, nome, estado);
            }
            return cidade;
        } catch (SQLException e) {
            throw new PortalDAOException("Erro ao procurar cidade " + e);
        } finally {
            Conexao.closeConnection(conn1, ps, rs);
        }
    }
}
